"""
封装解释：
    概述：
        在Python中，我们定义的函数的动作， 叫：封装
        在Python中，我们定义的类，类中有属性和行为，这个动作也叫封装

    专业化概述：
        封装就是隐藏对象属性和行为

    问题1：怎么隐藏？
        私有化的方式，__属性名，__方法名()，注意这里是两个下划线。
    问题2：公共的访问方式是什么？
        就是自己挺高的对外访问内部成员的接口（方法）
        获取私有属性：get_属性名，
        设置私有属性: set_属性名。

私有化的介绍：
    概述：被它修饰的内容只能在本类中使用，不可能在其他类中使用
"""
# 需求：定义一个人类，属性有姓名和私房钱，其中私房钱是私域的属性，不能被其他类访问
# 1：定义一个人类
class Person:
    def __init__(self, name):
        self.name = name
        # 私有属性，不可以被外部类访问
        self.__money = 1000

    # 方法名可以随便取，但是尽可能见名知意
    def set_Money(self, money):
        if self.__validate_money(money):
            self.__money += money

    # 私有方法，在外部是不可以访问的，但是在本类中是可以访问的
    def __validate_money(self, money):
        """
        验证交易的合法性
        :param money: 待验证的金额
        :return: 布尔值，表示交易是否合法
        """
        return isinstance(money, float) and money > 0

    def get_Money(self):
        return self.__money

if __name__ == '__main__':
    # 2: 创建一个对象
    p = Person("小明")

    # 3: 访问对象属性
    print(p.name)
    print(f"配偶看到了（小明）的私房钱:{p.get_Money()}")

    #追加私房钱
    p.set_Money(500.01)
    print(f"mate（小明）的私房钱:{p.get_Money()}")
    p.set_Money("aaa")
    print(f"mate（小明）的私房钱:{p.get_Money()}")